MFC程序,改变系统DPI后界面错位问题的处理

MFC程序默认系统DPI96时调整的界面,在 【个性设置-显示-中等(win7, xp类似)】 后,

出现控件错位的问题,是因为调整后DPI发生变化,相对的坐标也需要重新调整,修改方法如下:

1.调整函数的实现

#define DEFAULT_DPI 96.0
static int dpiX;
static int dpiY;
void moveWindow( CWnd &wnd )
{    
    CRect rect;    
    wnd.GetWindowRect(rect);    
    wnd.GetParent()->ScreenToClient(rect);    
    rect.left = (int)(rect.left*DEFAULT_DPI/dpiX);    
    rect.right = (int)(rect.right*DEFAULT_DPI/dpiX);    
    rect.top = (int)(rect.top*DEFAULT_DPI/dpiY);    
    rect.bottom = (int)(rect.bottom*DEFAULT_DPI/dpiY);    
    rect.OffsetRect(CPoint((int)((dpiX-DEFAULT_DPI)/2), (int)((dpiY-DEFAULT_DPI)/2)));   
    wnd.MoveWindow(rect);
}
void SetDPI( int x, int y )
{    
    dpiX = x;    
    dpiY = y;
}
int GetDPIX()
{    
    return dpiX;
}
int GetDPIY()
{    
    return dpiY;
}

2.设置dpi在程序第一个对话框初始化OnInitDialog()时,添加如下代码:

CDC* dc = GetDC();
int dpiX = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSX);
int dpiY = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSY);
SetDPI(dpiX, dpiY);
ReleaseDC(dc);

如果有通过SetWindowPos函数设置的控件,需要进行比例转换,例如:

button.SetWindowPos(NULL,0,0,(size_t)(width/DEFAULT_DPI*dpiX),
                             (size_t)(height/DEFAULT_DPI*dpiY),SWP_NOMOVE);

之后再调用函数moveWindow(CWnd &wnd)就可以进行坐标转换了。

本页共49段,1320个字符,1687 Byte(字节)